<?php defined('SYSPATH') or die('No direct script access.');
/**
 * 重写 Kohana_I18n 类，支持语言分包设置
 *
 * @author  Yellow.Chow <aultoale@gmail.com>
 * @version $Id: i18n.php 203 2012-05-11 10:06:25Z yellow.chow $
 * @license http://www.gnu.org/licenses/gpl-3.0.html    GPL 3
 */
abstract class I18n
{

    /**
     * 语言类型
     *
     * @var string
     */
    protected static $_lang = 'zh-cn';

    /**
     * 是否已执行初始化
     *
     * @var bool
     */
    protected static $_init = FALSE;

    /**
     * 语言包数据缓存
     *
     * @var array
     */
    protected static $_cache = array();

    /**
     * 设置&获取语言包类型
     *
     * @param  string  $lang
     * @return string
     */
    public static function lang($lang = NULL)
    {
        if ($lang)
        {
            I18n::$_lang = $lang;
            I18n::deinit();
        }

        return I18n::$_lang;
    }

    /**
     * 初始化加载语言包
     */
    public static function init()
    {
        if (I18n::$_init)
        {
            return ;
        }

        if ($files = Kohana::find_file('i18n', I18n::$_lang, NULL, TRUE))
        {
            $data = array();
            foreach ($files as $file)
            {
                $data = array_merge($data, Kohana::load($file));
            }

            I18n::$_cache += $data;
        }
    }

    /**
     * 取消初始化
     */
    public static function deinit()
    {
        I18n::$_init = FALSE;
        I18n::$_cache = array();
    }

    /**
     * 加载语言包
     *
     * @param  string  $package
     * @return array
     */
    public static function import($package)
    {
        if (Arr::path(I18n::$_cache, $package) === NULL)
        {
            I18n::init();

            // 获取语言包路径
            $path = I18n::$_lang.DS.str_replace('.', DS, $package);

            $data = array();

            // 加载语言包文件
            if ($files = Kohana::find_file('i18n', $path, NULL, TRUE))
            {
                foreach ($files as $file)
                {
                    $data = array_merge($data, Kohana::load($file));
                }
            }

            // 生成数组数据
            Arr::set_path(I18n::$_cache, $package, $data);
        }

        return Arr::path(I18n::$_cache, $package);
    }

    /**
     * 获取翻译后的语言字符
     *
     * @param  string  $string
     * @param  string  $package
     * @return string
     */
    public static function get($string, $package = NULL)
    {
        I18n::init();

        if ($package)
        {
            I18n::import($package);
            $string = $package.'.'.$string;
        }

        $translate = Arr::path(I18n::$_cache, $string, $string);

        return is_string($translate) ? $translate : $string;
    }

    /**
     * 返回语言数据包
     *
     * @return array
     */
    public static function as_array()
    {
        return I18n::$_cache;
    }

}

if ( ! function_exists('__'))
{
    /**
     * 简化 I18n 调用方法，并使用 strtr 处理字符串
     *
     * @param  string  $string
     * @param  array   $values
     * @return string
     */
    function __($string, array $values = NULL)
    {
        if ( ! is_string($string) OR empty($string))
        {
            return $string;
        }

        // 解析并匹配语言包
        $matches = explode('.', $string);
        $string = array_pop($matches);

        $package = $matches ? implode('.', $matches) : NULL;

        $translate = I18n::get($string, $package);

        return empty($values) ? $translate : strtr($translate, $values);
    }
}
